package com.willian.andrappfw.utils;

import android.annotation.SuppressLint;
import android.app.Activity;
import java.util.List;

import android.app.Dialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.berwin.cocoadialog.CocoaDialog;
import com.berwin.cocoadialog.CocoaDialogActionStyle;
import com.berwin.cocoadialog.CocoaDialogStyle;
import com.berwin.cocoadialog.CocoaDialog.Builder;
import com.berwin.cocoadialog.CocoaDialogAction.OnClickListener;

import com.bumptech.glide.Glide;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.willian.andrappfw.R.id;
import com.willian.andrappfw.R.anim;
import com.willian.andrappfw.R.drawable;
import com.willian.andrappfw.R.layout;

import com.willian.andrappfw.ui.WCustomDialogBuilder;


public class WDialogBuilder {
    @NonNull
    private Activity mActivity;

    public WDialogBuilder(@NonNull Activity activity) {
        this.mActivity = activity;
    }

    public CocoaDialog getDialog(String title, String message, String negativeButton, String positiveButton, WDialogBuilder.DialogClickListener socoDialogClickListener) {
        Builder builder = new Builder(this.mActivity);
        if (!TextUtils.isEmpty(title)) {
            builder.setTitle(title);
        }

        if (!TextUtils.isEmpty(message)) {
            builder.setMessage(message);
        }

        builder.addAction(negativeButton, CocoaDialogActionStyle.cancel, socoDialogClickListener != null ? (dialog) -> {
            socoDialogClickListener.onFirstButtonClicked();
        } : null).addAction(positiveButton, CocoaDialogActionStyle.normal, socoDialogClickListener != null ? (dialog) -> {
            socoDialogClickListener.onSecondButtonClicked();
        } : null);
        return builder.build();
    }

    public CocoaDialog showDialog(int titleStrId, int messageStrId, int negativeButtonStrId, int positiveButtonStrId, WDialogBuilder.DialogClickListener wDialogClickListener) {
        Resources r = this.mActivity.getResources();
        String title = r.getString(titleStrId);
        String message = r.getString(messageStrId);
        String negativeButton = r.getString(negativeButtonStrId);
        String positiveButton = r.getString(positiveButtonStrId);
        CocoaDialog dialog = this.getDialog(title, message, negativeButton, positiveButton, wDialogClickListener);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

        return dialog;
    }

    public CocoaDialog showDialog(String title, String message, String negativeButton, String positiveButton, WDialogBuilder.DialogClickListener wDialogClickListener) {
        CocoaDialog dialog = this.getDialog(title, message, negativeButton, positiveButton, wDialogClickListener);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

        return dialog;
    }

    public CocoaDialog getSingleButtonDialog(String title, String message, String negativeButton, OnClickListener onClickListener) {
        Builder builder = new Builder(this.mActivity);
        if (!TextUtils.isEmpty(title)) {
            builder.setTitle(title);
        }

        if (!TextUtils.isEmpty(message)) {
            builder.setMessage(message);
        }

        builder.addAction(negativeButton, CocoaDialogActionStyle.cancel, onClickListener);
        return builder.build();
    }

    public CocoaDialog showSingleButtonDialog(String title, String message, String negativeButton, OnClickListener onClickListener) {
        CocoaDialog dialog = this.getSingleButtonDialog(title, message, negativeButton, onClickListener);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

        return dialog;
    }

    public CocoaDialog showSingleButtonDialog(int titleStrId, int messageStrId, int negativeButtonStrId, OnClickListener onClickListener) {
        Resources r = this.mActivity.getResources();
        String title = r.getString(titleStrId);
        String message = r.getString(messageStrId);
        String negativeButton = r.getString(negativeButtonStrId);
        CocoaDialog dialog = this.getSingleButtonDialog(title, message, negativeButton, onClickListener);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

        return dialog;
    }

    @SuppressLint("WrongConstant")
    public CocoaDialog getLoadingDialog(CharSequence message) {
        Builder builder = new Builder(this.mActivity, CocoaDialogStyle.custom);
        View loadingView = LayoutInflater.from(this.mActivity).inflate(layout.dialog_loading, (ViewGroup)null, false);
        Animation animation = AnimationUtils.loadAnimation(this.mActivity, anim.dialog_loading_anim);
        ImageView circleView = (ImageView)loadingView.findViewById(id.dialog_loading_iv_loading);
        TextView messageView = (TextView)loadingView.findViewById(id.tv_dialog_desc);
        if (TextUtils.isEmpty(message)) {
            messageView.setVisibility(8);
        } else {
            messageView.setText(message);
            messageView.setVisibility(0);
        }

        circleView.setAnimation(animation);
        circleView.startAnimation(animation);
        return builder.setCustomWidth(-2).setCustomHeight(-2).setCustomContentView(loadingView).build();
    }

    public CocoaDialog showLoadingDialog(CharSequence message) {
        CocoaDialog dialog = this.getLoadingDialog(message);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

        return dialog;
    }

    public CocoaDialog showLoadingDialog() {
        return this.showLoadingDialog((CharSequence)null);
    }

    public CocoaDialog showEmergencyDialog(int drawableId, int titleId, int messageId, long timellis, boolean isScreenOriatationHorizontal) {
        View view = LayoutInflater.from(this.mActivity).inflate(layout.dialog_emr, (ViewGroup)null, false);
        LinearLayout dialog_emr_cl_01 = (LinearLayout)view.findViewById(id.dialog_emr_cl_01);
        ImageView dialog_emr_iv_emr = (ImageView)view.findViewById(id.dialog_emr_iv_emr);
        TextView dialog_emr_iv_title = (TextView)view.findViewById(id.dialog_emr_iv_title);
        TextView dialog_emr_iv_msg = (TextView)view.findViewById(id.dialog_emr_iv_msg);
        String title = this.mActivity.getResources().getString(titleId);
        String message = this.mActivity.getResources().getString(messageId);
        dialog_emr_iv_title.setText(title);
        dialog_emr_iv_msg.setText(message);
        Glide.with(this.mActivity).load(drawableId).into(dialog_emr_iv_emr);
        view.setBackgroundResource(drawable.dialog_bg);
        Builder builder = new Builder(this.mActivity, CocoaDialogStyle.custom);
        CocoaDialog dialog = builder.setCustomWidth(-2).setCustomHeight(-2).setCustomContentView(view).build();
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
            view.postDelayed(dialog::dismiss, 15000L);
        }

        return dialog;
    }

    @SuppressLint("WrongConstant")
    public <T> CocoaDialog showListDialog(int titleStrId, List<T> datas, BaseQuickAdapter<T, BaseViewHolder> adapter) {
        View view = LayoutInflater.from(this.mActivity).inflate(layout.dialog_ios_list, (ViewGroup)null, false);
        TextView dialog_ios_list_tv_title = (TextView)view.findViewById(id.dialog_ios_list_tv_title);
        RecyclerView dialog_ios_list_rcy = (RecyclerView)view.findViewById(id.dialog_ios_list_rcy);
        dialog_ios_list_tv_title.setText(this.mActivity.getResources().getString(titleStrId));
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this.mActivity);
        linearLayoutManager.setOrientation(1);
        dialog_ios_list_rcy.setLayoutManager(linearLayoutManager);
        DividerItemDecoration divider = new DividerItemDecoration(this.mActivity, 1);
        Drawable div = ContextCompat.getDrawable(this.mActivity, drawable.activity_setting_rcy_divider_style);
        if (div != null) {
            divider.setDrawable(div);
        }

        dialog_ios_list_rcy.addItemDecoration(divider);
        dialog_ios_list_rcy.setAdapter(adapter);
        CocoaDialog dialog = (new Builder(this.mActivity, CocoaDialogStyle.custom)).setCustomWidth(-2).setCustomHeight(-2).setCustomContentView(view).build();
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

        return dialog;
    }

    public CocoaDialog showLoadingSuccess(String message) {
        View view = LayoutInflater.from(this.mActivity).inflate(layout.dialogfragment_loading_success, (ViewGroup)null, false);
        TextView tv_01 = (TextView)view.findViewById(id.dialogfragment_loading_success_tv_01);
        tv_01.setText(message);
        CocoaDialog dialog = (new Builder(this.mActivity, CocoaDialogStyle.custom)).setCustomWidth(-2).setCustomHeight(-2).setCustomContentView(view).build();
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
            view.postDelayed(dialog::dismiss, 2000L);
        }

        return dialog;
    }

    public static void dismissDialog(Dialog dialog) {
        if (dialog != null && dialog.isShowing()) {
            Context context = dialog.getContext();
            if (dialog.getContext() instanceof ContextWrapper) {
                context = ((ContextWrapper)context).getBaseContext();
            }

            if (context instanceof Activity) {
                Activity activity = (Activity)context;
                if (!activity.isFinishing() && !activity.isDestroyed()) {
                    dismiss(dialog);
                }
            } else {
                dismiss(dialog);
            }

        }
    }

    private static void dismiss(Dialog dialog) {
        try {
            dialog.dismiss();
        } catch (Exception var2) {
        }

    }

    public void showPrivacyDialog() {
        View view = LayoutInflater.from(this.mActivity).inflate(layout.dialog_privacy, (ViewGroup)null, false);
        TextView button0 = (TextView)view.findViewById(id.button0);
        TextView button1 = (TextView)view.findViewById(id.button1);
        CocoaDialog dialog = (new Builder(this.mActivity, CocoaDialogStyle.custom)).setCustomWidth(-2).setCustomHeight(-2).setCustomContentView(view).build();
        android.view.View.OnClickListener onClickListener = (v) -> {
            dismissDialog(dialog);
        };
        ((TextView)view.findViewById(id.text)).setText("本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务，本应用会按照本隐私权政策的规定使用和披露您的个人信息。但本应用将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外，除本隐私政策相关有规定外在未得到您允许 的情况下，本应用不会将这些信息向第三放提供在未征得您事先许可的情况下，本应用不会将这些信息对外披露或向第三方提供。本应用会不时更新本隐私权政策。 您在同意本应用服务使用协议之时，即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本应用服务使用协议不可分割的一部分。\n\n        1. 适用范围\n\n在您注册本应用帐号时，您根据本应用要求提供的个人注册信息；\n\n在您使用本应用网络服务，或访问本应用平台网页时，本应用自动接收并记录的您的浏览器和计算机上的信息，包括但不限于您的IP地址、浏览器的类型、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据；\n\n本应用通过合法途径从商业伙伴处取得的用户个人数据。\n\n您了解并同意，以下信息不适用本隐私权政策：\n\n①您在使用本应用平台提供的搜索服务时输入的关键字信息；\n\n②本应用收集到的您在本应用发布的有关信息数据，包括但不限于参与活动、成交信息及评价详情；\n\n③违反法律规定或违反本应用规则行为及本应用已对您采取的措施。\n\n        2. 信息使用\n\n本应用不会向任何无关第三方提供、出售、出租、分享或交易您的个人信息，除非事先得到您的许可，或该第三方和本应用（含本应用关联公司）单独或共同为您提供服务，且在该服务结束后，其将被禁止访问包括其以前能够访问的所有这些资料。\n\n本应用亦不允许任何第三方以任何手段收集、编辑、出售或者无偿传播您的个人信息。任何本应用平台用户如从事上述活动，一经发现，本应用有权立即终止与该用户的服务协议。\n\n为服务用户的目的，本应用可能通过使用您的个人信息，向您提供您感兴趣的信息，包括但不限于向您发出产品和服务信息，或者与本应用合作伙伴共享信息以便他们向您发送有关其产品和服务的信息（后者需要您的事先同意）。\n\n        3. 信息披露\n\n在如下情况下，本应用将依据您的个人意愿或法律的规定全部或部分的披露您的个人信息：\n\n经您事先同意，向第三方披露；\n\n为提供您所要求的产品和服务，而必须和第三方分享您的个人信息；\n\n根据法律的有关规定，或者行政或司法机构的要求，向第三方或者行政、司法机构披露；\n\n如您出现违反中国有关法律、法规或者本应用服务协议或相关规则的情况，需要向第三方披露；\n\n如您是适格的知识产权投诉人并已提起投诉，应被投诉人要求，向被投诉人披露，以便双方处理可能的权利纠纷；\n\n在本应用平台上创建的某一交易中，如交易任何一方履行或部分履行了交易义务并提出信息披露请求的，本应用有权决定向该用户提供其交易对方的联络方式等必要信息，以促成交易的完成或纠纷的解决。\n\n其它本应用根据法律、法规或者网站政策认为合适的披露。\n\n        4. 信息存储和交换\n\n本应用收集的有关您的信息和资料将保存在本应用及（或）其关联公司的服务器上，这些信息和资料可能传送至您所在国家、地区或本应用收集信息和资料所在地的境外并在境外被访问、存储和展示。\n\n        5. Cookie的使用\n\n在您未拒绝接受cookies的情况下，本应用会在您的计算机上设定或取用cookies ，以便您能登录或使用依赖于cookies的本应用平台服务或功能。本应用使用cookies可为您提供更加周到的个性化服务，包括推广服务。\n\n您有权选择接受或拒绝接受cookies。您可以通过修改浏览器设置的方式拒绝接受cookies。但如果您选择拒绝接受cookies，则您可能无法登录或使用依赖于cookies的本应用网络服务或功能。\n\n通过本应用所设cookies所取得的有关信息，将适用本政策\n\n      6. 信息安全\n\n本应用帐号均有安全保护功能，请妥善保管您的用户名及密码信息。本应用将通过对用户密码进行加密等安全措施确保您的信息不丢失，不被滥用和变造。尽管有前述安全措施，但同时也请您注意在信息网络上不存在“完善的安全措施”。\n\n在使用本应用网络服务进行网上交易时，您不可避免的要向交易对方或潜在的交易对\n\n        7.本隐私政策的更改\n\n如果决定更改隐私政策，我们会在本政策中、本公司网站中以及我们认为适当的位置发布这些更改，以便您了解我们如何收集、使用您的个人信息，哪些人可以访问这些信息，以及在什么情况下我们会透露这些信息。\n\n本公司保留随时修改本政策的权利，因此请经常查看。如对本政策作出重大更改，本公司会通过网站通知的形式告知。\n\n        8.知识产权相关\n\n您了解并同意我方有权随时检查您所上传或发布的内容，如果发现您上传的内容不符合前述规定，我方有权删除或重新编辑或修改您所上传或发布的内容，且有权在不事先通知您的情况下停用您的账号。您亦了解、同意并保证，您所上传或发布的内容符合前述规定，是您的义务，而非我方，我方无任何对您上传或发布的内容进行主动检查、编辑或修改的义务。\n\n若您在本软件上的上传或发布内容的行为给第三方带来损害或损失，第三方主张赔偿或衍生的任何其他权利的，由您独立承担全部法律责任，我方及合作方概不承担任何责任。\n\n我方不对用户上传或发布的内容的合法性、正当性、完整性或品质作出任何保证，用户需自行承担因使用或依赖由软件所传送的内容或资源所产生的风险，我方在任何情况下对此种风险可能或实际带来的损失或损害都不负任何责任。\n\n        9.法律责任与免责申明\n\n我方将会尽其商业上的合理努力以保护用户的设备资源及通讯的隐私性和完整性，但是，用户承认和同意我方不能就此事提供任何保证。\n\n我方可以根据用户的使用状态和行为，为了改进软件的功能、用户体验和服务，开发或调整软件功能\n\n我方为保障业务发展和调整的自主权，有权随时自行修改或中断软件服务而无需通知用户。\n\n在任何情况下用户因使用或不能使用本软件所产生的直接、间接、偶然、特殊及后续的损害及风险，我方及合作方不承担任何责任。\n\n因技术故障等不可抗事件影响到服务的正常运行的，我方及合作方承诺在第一时间内与相关单位配合，及时处理进行修复，但用户因此而遭受的一切损失，我方及合作方不承担责任。\n\n用户通过软件与其他用户联系，因受误导或欺骗而导致或可能导致的任何心理、生理上的伤害以及经济上的损失，由过错方依法承担所有责任，一概与我方及合作方无关。\n");
        button0.setOnClickListener(onClickListener);
        button1.setOnClickListener(onClickListener);
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        if (!this.mActivity.isFinishing() && !this.mActivity.isDestroyed()) {
            dialog.show();
        }

    }

    public static <T> CocoaDialog createSpinnerDialog(Context context, List<T> dataList, int itemLayoutId, int textViewId) {
        return WCustomDialogBuilder.with(context).setLayoutId(layout.spinner_dialog).setGravity(17).setInitListener((dialog, dialogView) -> {
            RecyclerView recyclerView = (RecyclerView)dialogView.findViewById(id.recyclerView);
            recyclerView.setLayoutManager(new LinearLayoutManager(context));
            BaseQuickAdapter<T, BaseViewHolder> adapter = new BaseQuickAdapter<T, BaseViewHolder>(itemLayoutId, dataList) {
                protected void convert(@NonNull BaseViewHolder helper, T item) {
                    helper.setText(textViewId, item.toString()).addOnClickListener(new int[]{textViewId});
                }
            };
            adapter.setOnItemChildClickListener((adapter1, view, position) -> {
                dialog.dismiss();
                if (context instanceof WDialogBuilder.OnSpinnerDialogSelectedListener) {
                    ((WDialogBuilder.OnSpinnerDialogSelectedListener)context).onItemSelected(dialog, dataList.get(position), position);
                }

            });
            recyclerView.setAdapter(adapter);
        }).setWidth((int)((double)context.getResources().getDisplayMetrics().widthPixels * 0.8D)).setHeight(-2).create();
    }

    public static <T> CocoaDialog createSpinnerDialog(Context context, List<T> dataList, int dialogLayoutId, int itemLayoutId, int textViewId) {
        return WCustomDialogBuilder.with(context).setLayoutId(dialogLayoutId).setGravity(17).setInitListener((dialog, dialogView) -> {
            RecyclerView recyclerView = (RecyclerView)dialogView.findViewById(id.recyclerView);
            recyclerView.setLayoutManager(new LinearLayoutManager(context));
            BaseQuickAdapter<T, BaseViewHolder> adapter = new BaseQuickAdapter<T, BaseViewHolder>(itemLayoutId, dataList) {
                protected void convert(@NonNull BaseViewHolder helper, T item) {
                    helper.setText(textViewId, item.toString()).addOnClickListener(new int[]{textViewId});
                }
            };
            adapter.setOnItemChildClickListener((adapter1, view, position) -> {
                dialog.dismiss();
                if (context instanceof WDialogBuilder.OnSpinnerDialogSelectedListener) {
                    ((WDialogBuilder.OnSpinnerDialogSelectedListener)context).onItemSelected(dialog, dataList.get(position), position);
                }

            });
            recyclerView.setAdapter(adapter);
        }).setWidth((int)((double)context.getResources().getDisplayMetrics().widthPixels * 0.8D)).setHeight(-2).create();
    }

    public interface OnSpinnerDialogSelectedListener<T> {
        void onItemSelected(CocoaDialog var1, T var2, int var3);
    }

    public interface ListDialogListener {
        void onChosen(int var1, String var2);
    }

    public interface DialogClickListener {
        void onFirstButtonClicked();

        void onSecondButtonClicked();
    }
}

